package com.sentinel.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
//测试熔断
@RestController
public class SentinelAnnController {
    /*
    *  TODO 限流  熔断降级 可在sentinel控制台设置
    *  限流：当请求量超过设置值，则sentinel拒绝请求 （告知：系统繁忙！）
    *  熔断降级：当请求量超过设置值，则开启熔断，熔断以后拒绝请求，并且在熔断时长中也不可请求
    *  sentinel-dashboard-1.8.3.jar 启动命令：java -Dserver.port=9000  -jar sentinel-dashboard-1.8.3.jar
    * */

    //定义资源  value:设置资源名称   blockHandler:设置限流或降级的处理函数
    @SentinelResource(value ="Sentinel_Rule",blockHandler = "execptionHandler")
    @GetMapping("ann")
    public String hello(){
       //使用限流规则
      return "hello sentinel";
    }

    //被限流或降级的处理函数
    public String execptionHandler(BlockException e){
        e.printStackTrace();
        return "系统繁忙,请稍后";
    }


    //定义熔断降级规则
   /* @PostConstruct
    public void intiDegradeRule(){
        //1、创建存放规则的集合
        List<DegradeRule> rules = new ArrayList<>();
        //2、创建熔断降级规则
        DegradeRule rule = new DegradeRule();
        //定义资源名称
        rule.setResource("Sentinel_Rule");
        //定义规则类型  RuleConstant.DEGRADE_GRADE_RT:秒级RT 平均响应时间类型
        rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
        //定义阈值
        rule.setCount(0.01);
        //定义降级时间
        rule.setTimeWindow(10);
        //3、将规则保存到集合中
        rules.add(rule);
        //4、加载规则
        DegradeRuleManager.loadRules(rules);
    }
*/

}
